sscanf関数は、引数で指定した領域から、書式に従い値を取り出します。
この関数はscanf関数やfscanf関数と似ていますが、ファイルから入力するのではなく、指定された領域から入力する点が異なります。
#include <stdio.h>
int sscanf(const char *str, const char *format, …);
*strは取り出す値を含む領域を指定します。
*format(書式)は第3引数以降で指定する領域に入力する値の変換形式を指定します。
第3引数以降は可変引数で、任意の引数を指定できます。ただし、*formatにより、間接的に引数の型名と個数を指定することになります。sscanf関数がこれらの領域に取り出した値を設定しますので、引数は参照渡し(call by reference)になります。
戻り値として、取り出した要素の個数を返します。また、エラーの場合はEOFの値を返します。
*format(書式)はscanf関数やfscanf関数と同じですので、fscanf関数をご覧ください。
プログラム 例
#include <stdio.h> #include <string.h> int main(void) { char *StrAdd(char *); /* 加算 */ char *StrChomp(char *); /* 改行削除 */ char in_buff[100]; printf('加算の式を入力してください ==> '); fgets(in_buff, 100, stdin); printf('%s\n', StrAdd(StrChomp(in_buff))); return 0; } /* 加算 */ char *StrAdd(char *exp) { int atai1; int atai2; char sign[2]; static char buff[100]; if (sscanf(exp, '%d%1s%d', &atai1, sign, &atai2) == 3) { if (sign[0] == '+') { sprintf(buff, '%s = %d', exp, atai1 + atai2); } else { strcpy(buff, '演算子が不当です'); } } else { strcpy(buff, '式が不当です'); } return buff; } /* 改行削除 */ char *StrChomp(char *str) { char *str_p;; for (str_p = str; *str_p; ++str_p) ; if (*(str_p - 1) == '\n') { *(str_p - 1) = '\0'; } return str; }
例の実行結果
$ ./sscanf.exe 加算の式を入力してください ==> 10+20 10+20 = 30 $ $ ./sscanf.exe 加算の式を入力してください ==> 30 + 40 30 + 40 = 70 $ $ ./sscanf.exe 加算の式を入力してください ==> 10 * 20 演算子が不当です $ $ ./sscanf.exe 加算の式を入力してください ==> 20 式が不当です $